<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/vue.js"></script>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        .adver {
            width: 300px;
            /* height: 400px; */
            background-color: grey;
            position: fixed;
            right: 5px;
            bottom: 5px;
        }

        .adver-top {
            font-size: 14px;
            line-height: 30px;
        }

        .adver-top .adver-title {
            text-indent: 10px;
        }

        .adver-top .adver-close {
            padding: 0 5px;
            position: absolute;
            right: 0;
            top: 0;
        }
    </style>
</head>
<body>
    <div id="app">
        <!-- <asd>123123</asd> -->
        <p>{{count}}</p>
        <p><button @click="count++">count++</button></p>
        <my-adver></my-adver>
    </div>
</body>
<script>
     // Vue的组件化
    // 目的: 和模块化类似(将一个大的项目差分成相互依赖的小文件) => 但是组件化不仅限于分离JS,还有HTML,CSS  => 一个组件就是一个单独的Vue实例,每一个组件都有一套完整的功能   
    // 简单的来说:就是将Vue中的功能模块分离到单独的Vue实例中  => 实现代码复用

    // 组件是一个可复用的Vue实例 => 有自己的 data methods computed watch  生命周期钩子函数

    // 如何定义Vue组件?
    // 1. 全局组件  => 借助Vue的静态方法 Vue.component
    // Vue.component(comp-name,options)
    // comp-name 组件名称(字符串) => 对于复杂的组件名称,建议使用中划线命名法/大驼峰命名法
    // options  => 当前组件的配置对象 => {data methods computed watch  生命周期钩子函数}

    
    // 2. 局部组件

    

    // 如何使用组件?  => 
    // 把这个组件作为自定义元素(组件的名称就是对应的标签名),在根组件或父组件中使用   => 此时应该使用中划线命名法 (Vue3中可以使用大驼峰) 
    // 用法上属于自定义标签,但是Vue会将该自定义标签解析为vue实例,并在组件内html结构解析完毕之后 ,用其替换原本的自定义标签
    
    // 组件定义过程中需要注意:
    // 1. 一个组件的 data 选项必须是一个函数  => 如果设置为对象,每次使用组件上,数据是公有的


    // 组件的生命周期 => 组件是依赖于父组件/根组件存在的
    // 父组件开启初始化渲染 -> 创建Vue实例 -> 解析options配置对象 => 编译模板(1. 将html结构解析为虚拟dom 2. 在编译过程中遇到自定义标签,会将其作为组件解析(存在已定义) -> 开启子组件的初始化阶段),此时父组件需要等子组件解析完毕,方能继续向后执行,子组件也会创建Vue实例 -> 解析options配置对象 => 编译模板(将html结构解析为虚拟dom) => 渲染成真实DOM => 替换自定义标签)=>子组件挂载完毕, 父组件继续向后解析,等所有默认解析完毕之后 => 父组件将其解析为真实DOM渲染到页面上

    Vue.component("MyAdver",{
        data:function(){
            return {
                isShow:false,
                count:100,
                delayTimer:null,
                intervalTimer:null,
                delay:5000,
            }
        },
        template:`<div class="adver" v-if="isShow">
            <div class="adver-top">
                <div class="adver-title">距离广告关闭还有{{count}}秒</div>
                <div class="adver-close" @click="closeHandler">X</div>
            </div>
            <div class="adver-detail">
                <img src="../images/bzsc-dgbhz-300-250-7-5.gif" alt="">
            </div>
        </div>`,
        methods:{
            showAdver(){
                this.delayTimer = setTimeout(()=>{
                    this.isShow = true;
                    this.intervalTimer = setInterval(()=>{
                        this.count--;
                        if(this.count <= 0){
                            clearInterval(this.intervalTimer);
                            this.count = 10;// 重置count
                            this.isShow = false;
                            this.showAdver();
                        }
                    },1000);
                },this.delay)
            },
            closeHandler(){
                clearInterval(this.intervalTimer);
                clearTimeout(this.delayTimer);
                this.isShow = false;
                this.count = 10;
                this.showAdver();
            }
        },
        beforeCreate() {
            console.log("1. beforeCreate:子组件");
        },
        created() {
            console.log("2. created:子组件");
        },
        beforeMount() {
            console.log("3. beforeMount:子组件");
        },
        mounted() {
            console.log("4. mounted:子组件");
            console.log("子组件被挂载",this);
            this.showAdver();
        },
    })






    // 根组件(根实例 根应用)
    var vm = new Vue({
        el:"#app",
        data:{
           count:1,
        },
        beforeCreate() {
            console.log("1. beforeCreate:根组件");
        },
        created() {
            console.log("2. created:根组件");
        },
        beforeMount() {
            console.log("3. beforeMount:根组件",this.$el.innerHTML);
        },
        mounted() {
            console.log("4. mounted:根组件");
            console.log("根组件",this);
        },
    })
 



</script>
</html>